﻿package CutLoad.components
{
	import CutLoad.Base;
	import CutLoad.cookies.LayoutTable;

	/**
	 * 弹出 管理
	 * @author smallerbird
	 * 
	 */	
	public class CPopup extends Base
	{
		private var arr:Array=new Array();
		private var LT:LayoutTable
		//显示出来的宽，高
		private var displayWidth:Number=0,displayHeight:Number=0;
		public function CPopup()
		{
		}
		public function init(w:Number,h:Number):void{
			setWH(w,h);
		}
		/**
		 * 弹出一个带背景 元件
		 * @param base 要弹出的元件
		 * @param t 弹出画面的相对位置,默认为居中,详细值：-1:设置绝对坐标(0,0),0居中,1左上,2上中,3右上,4右中,5右下,6下中,7左下,8左中,注：布局是使用：CutLoad.cookies.LayoutTable来实现的。注:如果要设置绝对坐标，请继续看下面的参数。
		 * @param bakColor 弹出背景色
		 * @param bakAlpha 弹出背景色透明度，注：当透明度为0时，将不生成弹出背景
		 * @param xx 如果要设置显示绝对坐标的话，这里可以设置x坐标  这样会忽略相对位置参数
		 * @param yy 如果要设置显示绝对坐标的话，这里可以设置y坐标  这样会忽略相对位置参数
		 * @return 获得当前弹出元件的索引
		 * 
		 */				
		public function popup(base:Base,t:Number=0,bakColor:Number=0xffffff,bakAlpha:Number=0.5,xx:Number=0,yy:Number=0):Number{
			var bak:CRender=null;
			if(bakAlpha!=0){
				bak=new CRender();
				bak.init(0,0,{color:bakColor,alpha:bakAlpha,isBitmap:false},this.getShowWidth(),this.getShowHeight());
				this.addChild(bak);
			}
			if(t==-1){
				base.setXY(xx,yy);
			}else{
				if(xx==0&&yy==0){
					LT.setXY(t,base,0,0);
				}else{
					base.setXY(xx,yy);
				}
			}
			this.addChild(base);
			//如果xx,yy不为0，则为绝对坐标
			arr.push({bak:bak,base:base,t:t,xx:xx,yy:yy});
			//trace("arr.length:"+arr.length)
			this.stage.focus=base;
			return arr.length-1;
		}
		/**
		 * 是否有弹出框 
		 * @return 
		 * 
		 */		
		public function isHavePopup():Boolean{
			if(arr.length==0) return true;
			return false;
		}
		/**
		 * 弹出一个不带背景 元件
		 * @param base 要弹出的元件
		 * @param t 弹出画面的相对位置,默认为居中,详细值：-1:设置绝对坐标(0,0),0居中,1左上,2上中,3右上,4右中,5右下,6下中,7左下,8左中,注：布局是使用：CutLoad.cookies.LayoutTable来实现的。注:如果要设置绝对坐标，请继续看下面的参数。
		 * @param xx 如果要设置显示绝对坐标的话，这里可以设置x坐标  这样会忽略相对位置参数
		 * @param yy 如果要设置显示绝对坐标的话，这里可以设置y坐标  这样会忽略相对位置参数
		 * @return 
		 * <p>注：实际是调用popup(base:Base,t:Number=0,bakColor:Number=0xffffff,bakAlpha:Number=0.5) 只是设置了参数：bakAlpha 为0</p>
		 * 
		 */		
		public function popupNoBak(base:Base,t:Number=0,xx:Number=0,yy:Number=0):Number{
			return popup(base,t,0xffffff,0,xx,yy);
		}
		/**
		 * 清除一个    关于一些注意细节：当第一个参数不为空时。这方法会遍历保存对像进行比对。
		 * @param base
		 * @param index
		 * 
		 */		
		public function remove(base:Base=null,index:Number=-1):void{
			if(index!==-1){
				if(arr.length-1<index) throw new Error("不存在的索引#1！");
			}
			var obj:Object;
			if(index==-1){
				if(base==null) throw new Error("清除的对象为null");
				for(var i:Number=0;i<arr.length;i++){
					obj=arr[i];
					/*trace("----------------");
					trace(obj.base);
					trace(base);
					trace(obj.base==base);
					trace("----------------");*/
					if(obj!=null&&obj.base==base){
						index=i;
						break;
					}
				}
				if(index==-1) throw new Error("没有找到这个对象！");
			}
			obj=arr[index];
			ObjRemoveChild(obj);
			obj=null;
			arr[index]=null;
			//arr.splice(index,1);
		}
		/**
		 * 清除最前面的一个 
		 * 
		 */		
		public function removeTop():void{
			if(arr.length==0) return;
			var obj:Object=arr.pop();
			if(obj!=null) ObjRemoveChild(obj);	
		}
		private function ObjRemoveChild(obj:Object):void{
			if(obj.base!=null) {
				if(obj.base.parent!=null){
					obj.base.parent.removeChild(obj.base);
				}
				obj.base=null;
			}
			if(obj.bak!=null){
				this.removeChild(obj.bak);
				obj.bak=null;
			}
		}
		/**
		 * 清除所有的 
		 * 
		 */
		public function removeAll():void{
			var obj:Object;
			for(var i:Number=0;i<arr.length;i++){
				obj=arr[i];
				ObjRemoveChild(obj);
			}
			this.arr=new Array();
		}
		override public function setWH(w:Number=0, h:Number=0):void{
			if(w==0) w=this.getShowWidth();
			if(h==0) h=this.getShowHeight();
			displayWidth=w;
			displayHeight=h;
			//
			LT=new LayoutTable();
			LT.init([[w],[h]]);
			//
			var obj:Object;
			var base:Base;
			for(var i:Number=0;i<arr.length;i++){
				obj=arr[i];
				if(obj!=null){
					if(obj.bak!=null) obj.bak.setWH(w,h);
					base=obj.base;
					if(obj.xx==0&&obj.yy==0){
						if(obj.t==-1){
							base.setWH(0,0);
						}else{
							LT.setXY(obj.t,base,0,0);
						}
					}
				}
			}
		}
		override public function getShowWidth():Number{
			return displayWidth;
		}
		override public function getShowHeight():Number{
			return displayHeight;
		}
	}
}